#ifndef __RTTHREAD_LIST_H__
#define __RTTHREAD_LIST_H__

#include "rt_def.h"
struct rt_list_node
{
   struct rt_list_node *next;              /* 指向后一个节点 */
   struct rt_list_node *prev;              /* 指向前一个节点 */
};
typedef struct rt_list_node rt_list_t;


/* 初始化一个节点*/
rt_inline void rt_list_init(rt_list_t *l)
{
    l->next = l->prev = l;
}

/* 在双向链表头部插入一个节点*/
rt_inline void rt_list_insert_after(rt_list_t *l, rt_list_t *n)
{
    l->next->prev = n; 
    n->next = l->next; 
    l->next = n; 
    n->prev = l; 
}

/* 在双向链表表头前插入一个节点    ///  即在双向链表结尾插入一个节点 */
rt_inline void rt_list_insert_before(rt_list_t *l, rt_list_t *n)
{
    l->prev->next = n; 
    n->prev = l->prev; 
    l->prev = n; 
    n->next = l; 
}

/* 删除一个节点*/
rt_inline void rt_list_remove(rt_list_t *n)
{
    n->next->prev = n->prev; 
    n->prev->next = n->next; 
    n->next = n->prev = n; 
}


/* 已知一个结构体里面的成员的地址，反推出该结构体的首地址 */
#define rt_container_of(ptr, type, member) \
    ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))

#define rt_list_entry(node, type, member) \
    rt_container_of(node, type, member)


rt_inline int rt_list_isempty(const rt_list_t *l)
{
    return l->next == l;
}
#endif /* __RTTHREAD_LIST_H__ */